iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 13
1
自我挑戰組

Android初學筆記系列 第 13

Day 13 - 使用RecyclerView(1)

  • 分享至 

  • xImage
  •  

藝術般的元件

Android 5.0時提供了RecyclerView這個列表元件,作為ListView的強化版,它提供更好的效能表現、更高的靈活性,博客有文章將其稱為藝術般的元件。

實際使用後覺得RecyclerView的確很好用,尤其是自訂布局和增減項目的動畫效果個人覺得明顯優於ListView。然而使用門檻也高了一點點,我們今天就逐步建立一個最基本的RecyclerView,只要完成以下項目:

  1. 加入dependencies
  2. 建立項目布局
  3. 建立Adapter
  4. 設置RecyclerView

1.加入dependencies

因為RecyclerView並不是內建的元件,我們須另外將其加入專案,只要在gradle加入下面這行,並按右上角的Sync Now就可以了

compile 'com.android.support:recyclerview-v7:25.1.0'

http://ithelp.ithome.com.tw/upload/images/20161228/20103849bA2bZAC9Ud.png


2.建立項目布局

這個指的是每一列要顯示的內容,在layout按右鍵 -> New -> Layout resource file
http://ithelp.ithome.com.tw/upload/images/20161228/20103849WUYU0f2Rnc.png

建立名稱為list_item的布局檔,我們先簡單一點顯示一行文字就好

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="72dp"
    android:gravity="center_vertical"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txtItem"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

當中android:gravity="center_vertical"這行表示佈局的內容要垂直置中


3.建立Adapter

RecyclerView沒有內建的ArrayAdapter可用,所以我們自己建一個。在package上按右鍵 -> New -> Java Class
http://ithelp.ithome.com.tw/upload/images/20161228/20103849eycszf3S45.png

建立名稱為MyAdapter的Class,前一步建立的list_item就會在這用上

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

    private List<String> mData;

    MyAdapter(List<String> data) {
        mData = data;
    }

    // 建立ViewHolder
    class ViewHolder extends RecyclerView.ViewHolder{
        // 宣告元件
        private TextView txtItem;

        ViewHolder(View itemView) {
            super(itemView);
            txtItem = (TextView) itemView.findViewById(R.id.txtItem);
        }
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // 連結項目布局檔list_item
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        // 設置txtItem要顯示的內容
        holder.txtItem.setText(mData.get(position));
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }
}

4.設置RecyclerView

最後把RecyclerView跟MyAdapter連結起來就完成了,步驟跟ListView很像

佈局檔activity_main

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>

Java程式碼,可以注意到RecyclerView多了LayoutManager和ItemDecoration可以設定

public class MainActivity extends AppCompatActivity {

    private RecyclerView recycler_view;
    private MyAdapter adapter;
    private ArrayList<String> mData = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 準備資料,塞50個項目到ArrayList裡
        for(int i = 0; i < 50; i++) {
            mData.add("項目"+i);
        }

        // 連結元件
        recycler_view = (RecyclerView) findViewById(R.id.recycler_view);
        // 設置RecyclerView為列表型態
        recycler_view.setLayoutManager(new LinearLayoutManager(this));
        // 設置格線
        recycler_view.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));

        // 將資料交給adapter
        adapter = new MyAdapter(mData);
        // 設置adapter給recycler_view
        recycler_view.setAdapter(adapter);
    }
}

這樣就完成基本的RecyclerView啦!執行APP會發現目前看起來跟ListView沒兩樣,因為我們還沒對它做進一步的調整,這部分明天再做,我覺得今天能建立起來就很棒了哦。
http://ithelp.ithome.com.tw/upload/images/20170101/20103849gNSaQBrOcs.png

我剛開始使用時覺得RecyclerView比其他元件複雜好多,隨著時間推進它也越來越親民了,當初連格線都沒有內建的可以用!今天建立最基本的樣子希望讓大家比較好上手,明天再來一起發掘它被稱為藝術的特點。


上一篇
Day 12 - 列表與Adapter
下一篇
Day 14 - 使用RecyclerView(2)
系列文
Android初學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言